﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GestionEco
{
    public abstract class Animal : EtreVivant
    {

        protected int attaque;
        protected int esquive;
        protected int degats;
        protected int vue;
        protected int regen;
        protected int faimMax;
        protected int faimActuelle;


        #region assesseurs

        public int Attaque
        {
            get { return attaque; }
            set { attaque = value; }
        }

        public int Esquive
        {
            get { return esquive; }
            set { esquive = value; }
        }

        public int Degats
        {
            get { return degats; }
            set { degats = value; }
        }

        public int Vue
        {
            get { return vue; }
            set { vue = value; }
        }

        public int Regen
        {
            get { return regen; }
            set { regen = value; }
        }

        public int FaimMax
        {
            get { return faimMax; }
            set { faimMax = value; }
        }

        public int FaimActuelle
        {
            get { return faimActuelle; }
            set { faimActuelle = value; }
        }
        
        #endregion


        public Animal(int uneVieMax, int uneAttaque, int uneEsquive, int desDegats, int uneVue, int uneRegen, int uneFaimMax, int uneSoifMax, int desPointsActionActuels)
            : base(uneVieMax, uneSoifMax, desPointsActionActuels)
        {
            Random random = new Random();

            this.attaque = uneAttaque * (random.Next(1, 7));
            this.esquive = uneEsquive*(random.Next(1, 7));
            this.degats = desDegats*(random.Next(1, 7));
            this.vue = uneVue*random.Next(1, 7);
            this.regen = uneRegen*random.Next(1, 7);
            this.faimMax = (uneFaimMax*random.Next(1, 7)) * 10;
            this.faimActuelle = faimMax;



        }
               
        public override void attaquer(Animal uneCible)
        {

            /*         
            * Gestion de l'attaque d'un animal par un autre
            */

            Random rndm = new Random();
            int scoreAttaque = 0;
            int scoreEsquive = 0;
            /*
             * on calcul le jet d'attaque de l'attaquant et le jet d'esquive du defenseur.
            */
            for (int i = 0; i < this.Attaque; i ++) 
            {
                scoreAttaque += rndm.Next(1, 6);
            }


            for (int i = 0; i < uneCible.Esquive; i++)
            {
                scoreEsquive += rndm.Next(1, 6);
            }

            // action selon si la cible est touchée ou non. 
            if (scoreAttaque > scoreEsquive)
            {
                uneCible.VieActuelle -= infligerDegats();
                Console.WriteLine("Attaque réussie");
            }
            else
            {
                Console.WriteLine("Echec de l'attaque");
            }
        }

        public override int infligerDegats()
        {

            /*
             * Fonction de calcul de degats 
            */

            int scoreDegats = 0;
            Random rndm = new Random();
            for (int i = 0; i < this.Degats; i++)
            {
                scoreDegats += rndm.Next(1, 3);
            }
            return scoreDegats;
        }

        public override void afficher()
        {
            Console.WriteLine("je suis un animal");
        }

        public override void regenerer()
        {
            /*
             * Fonction de calcul de regeneration 
            */

            if (vieActuelle < vieMax)
            {
                Random rndm = new Random();
                int scoreRegen = 0;
                for (int i = 0; i < this.Regen; i++)
                {
                    // on calcul le score de regeneration
                    scoreRegen += rndm.Next(1,3);
                }
                this.VieActuelle += scoreRegen;
                if (vieActuelle > vieMax)
                {
                    // si apres regen la vie actuelle est supérieure a la vie max, on remet la vie actuelle au niveau de la vie max
                    VieActuelle = vieMax;
                }
            }
        }
    }
}
